#include <stdio.h>
#include <string.h>
#include <stdio.h>

/*
int main(int argc, char const *argv[]){
       int i;
       //int k; 

       printf("hello\n");
       int k;  //早期版本c编译器可能编译不通过
       i = 10;
       k =11;
       printf("i:%d, k:%d \n",i, k);
        return 0;
}
*/

/*
int main(int argc, char const *argv[])
{
        register int a = 0;
        printf("&a:%d \n", &a); //编译不通过 不能在寄存器变量取地址        
        return 0;
}
*/

/*
int g_a;
int g_a = 100;

int main(int argc, char const *argv[]){
        printf("hello world g_a:%d \n", g_a); //c编译器可以编译通过
        return 0;
}
*/

/*
struct Teacher{
        char name[32];
        int age;
};

int main(int argc, char const *argv[]){
        //Teacher t1; //c编译器会报错
        struct Teacher t1; //必须加struct
        t1.age = 10;
        return 0;
}
*/

/*
c++中所有的变量和函数必须有类型
        c语言中的默认类型在c++中是不合法的
函数f的返回值是什么类型,参数又是什么类型？
函数g可以接受多少个参数?

f(i){
        printf("i = %d\n",i);
}
g(){
        return 5;
}
int main(int argc, char const *argv[])
{
        f(10);
        printf("g() = %d\n", g(1,2,3,4,5)); //c编译器通过 c++是不可以
        return 0;
}
*/
 
 /*
//在c语言中 表达式的运算结果 放在 寄存器
//在c语言中 表达式的返回值 是一个数
//在c++中,表达式返回的是变量的自身
int main(int argc, char const *argv[]){
        int a = 10;
        int b =20;
        //返回最小数 并且给最小数赋值成30
        (a<b?a:b) = 30; //c编译器编译失败 表达式不能做左值
        //相当于
        20 = 30;

        printf("a = %d, b = %d \n", a , b); 
         return 0;
}


//如何像c++那样做到呢?
int main(int argc, char const *argv[]){
        int a = 10;
        int b =20;
        
        //返回最小数 并且给最小数赋值成30
        //(a<b?a:b) = 30; //c编译器编译失败 表达式不能做左值
        *(a<b?&a:&b) = 30;
        printf("a = %d, b = %d \n", a , b); 
         return 0;
}
*/

//c语言中的const是一个冒牌货
int main(int argc, char const *argv[])
{
        //好像 a是一个常量
        const int a = 10;
        //a = 11;
        int *p = NULL;
        p = (int *)&a;

        *p = 20;

        printf("a = %d \n", a);  // a = 20

        return 0;
}
